home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / lib / xt / action.c < prev    next >
C/C++ Source or Header  |  1992-10-06  |  2KB  |  83 lines

  1. #include "xt.h"
  2.  
  3. typedef struct action {
  4.     char *name;
  5.     int num;
  6.     XtAppContext con;
  7.     struct action *next;
  8. } ACTION;
  9.  
  10. ACTION *actions;
  11.  
  12. /*ARGSUSED*/
  13. static void Dummy_Action (w, ep, argv, argc) Widget w; XEvent *ep;
  14.     String *argv; int *argc; {
  15. }
  16.  
  17. void Action_Hook (w, client_data, name, ep, argv, argc)
  18.     Widget w; XtPointer client_data; char *name; XEvent *ep;
  19.     char **argv; int *argc; {
  20.     ACTION *ap;
  21.     Object args, params, tail;
  22.     register i;
  23.     GC_Node3;
  24.  
  25.     for (ap = actions; ap; ap = ap->next) {
  26.     if (strcmp (ap->name, name))
  27.         continue;
  28.     args = params = tail = Null;
  29.     GC_Link3 (args, params, tail);
  30.     params = P_Make_List (Make_Fixnum (*argc), Null);
  31.     for (i = 0, tail = params; i < *argc; tail = Cdr (tail), i++) {
  32.         Object tmp = Make_String (argv[i], strlen (argv[i]));
  33.         Car (tail) = tmp;
  34.     }
  35.     args = Cons (params, Null);
  36.     params = Get_Event_Args (ep);
  37.     args = Cons (Copy_List (params), args);
  38.     Destroy_Event_Args (params);
  39.     args = Cons (Make_Widget_Foreign (w), args);
  40.     (void)Funcall (Get_Function (ap->num), args, 0);
  41.     GC_Unlink;
  42.     }
  43. }
  44.  
  45. static Object P_Context_Add_Action (c, s, p) Object c, s, p; {
  46.     char *str;
  47.     ACTION *ap;
  48.     XtActionsRec a;
  49.     Declare_C_Strings;
  50.  
  51.     Check_Context (c);
  52.     Make_C_String (s, str);
  53.     Check_Procedure (p);
  54.     ap = (ACTION *)XtMalloc (sizeof (ACTION));
  55.     ap->num = Register_Function (p);
  56.     ap->name = XtNewString (str);
  57.     ap->con = CONTEXT(c)->context;
  58.     ap->next = actions;
  59.     actions = ap;
  60.     a.string = ap->name;
  61.     a.proc = Dummy_Action;
  62.     XtAppAddActions (ap->con, &a, 1);
  63.     Dispose_C_Strings;
  64.     return Void;
  65. }
  66.  
  67. void Free_Actions (con) XtAppContext con; {
  68.     register ACTION *p, **pp;
  69.  
  70.     for (pp = &actions; p = *pp; ) {
  71.     if (p->con == con) {
  72.         Deregister_Function (p->num);
  73.         XtFree (p->name);
  74.         *pp = p->next;
  75.         XtFree ((char *)p);
  76.     } else pp = &p->next;
  77.     }
  78. }
  79.  
  80. init_xt_action () {
  81.     Define_Primitive (P_Context_Add_Action, "context-add-action", 3, 3, EVAL);
  82. }
  83.